//
//  ViewController.m
//  XGTableView的用法详解
//
//  Created by 小果 on 16/7/5.
//  Copyright © 2016年 小果. All rights reserved.
//

#import "ViewController.h"
// 导入模型类
#import "XGExamModel.h"
// 导入自定义的cell
#import "XGExamCell.h"
#import "XGExamFrame.h"
#import "XGHeaderView.h"
#import "XGFooterView.h"

#define XGScreenW [UIScreen mainScreen].bounds.size.width
#define XGScreenH [UIScreen mainScreen].bounds.size.height

@interface ViewController ()<XGFooterViewDelegate,XGExamCellDelegate>
/**
 *  屏幕中央的阴影
 */
@property (nonatomic, weak) UIButton *cover;
/**
 *  用来存放转换后的模型的数组
 */
@property (nonatomic, strong) NSMutableArray *examArray;
@property (nonatomic, weak) UIImageView *bigView;
@property (nonatomic, copy) NSString *btnBigName;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 改变分割线的颜色
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.showsVerticalScrollIndicator = NO;
    
    // 创建一个footerView
    XGFooterView *footerView = [XGFooterView loadFooterView];
    self.tableView.tableFooterView = footerView;
    // 给footerView设置代理
    footerView.delegate = self;
    
    self.tableView.tableHeaderView = [XGHeaderView loadHeaderView];
    
    // 为头像的点击注册监听
    //    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iconImageHandClick:) name:@"iconImageClick" object:nil];
    
    // 为配图的点击注册监听
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(examCellWithPictureChangeBig:) name:@"pictureClick" object:nil];
    
    
}
#pragma mark - 懒加载
-(NSMutableArray *)examArray{
    // 先判断数组是否为空，如果为空就加在数据
    if(nil == _examArray){
        
        // 找到plist文件所在的路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"exam.plist" ofType:nil];
        
        //读取数据到数组中
        NSArray *tempArray = [NSArray arrayWithContentsOfFile:path];
        
        // 创建一个可变的临时数组，用来暂时存放转换后的模型数据
        NSMutableArray *mutableArray = [NSMutableArray array];
        
        // 对读取到的数据进行遍历和转换
        for (NSDictionary *dict in tempArray) {
            // 转换
            XGExamModel *examModel = [XGExamModel examWithDict:dict];
            
            XGExamFrame *examFrame = [[XGExamFrame alloc] init];
            examFrame.examM = examModel;
            // 将模型存放到临时数组
            [mutableArray addObject:examFrame];
        }
        // 赋值
        _examArray = mutableArray;
    }
    
    // 返回赋值后的数组
    return _examArray;
}

#pragma mark - 数据源方法
#pragma mark - 一共有多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
#pragma mark - 每组有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.examArray.count;
}
#pragma mark - 每行显示的内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    /*  // 定义一个可循环引用的标识
     static NSString *ID = @"exam";
     
     // 从缓存池中找这个标识
     XGExamCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
     
     // 如果没有找到，就重新实例化一个cell
     if(nil == cell){
     cell = [[XGExamCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
     }
     */
    
    XGExamCell *cell = [XGExamCell cellWithTableView:tableView];
    // 取出模型
    XGExamFrame *examFrame = self.examArray[indexPath.row];
    
    cell.examFrame = examFrame;
    
    // 设置cell的代理为当前的控制器
    cell.delegate = self;
    
    
    // 返回cell
    return cell;
    
}

#pragma mark - tableView代理方法(返回每行的高度)
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    XGExamFrame *examFrame = self.examArray[indexPath.row];
    return examFrame.cellHeight;
}

#pragma mark - footerView的代理方法
-(void)XGFooterViewLoadBtnClick:(XGFooterView *)footerView{
    // 当点击加载数据按钮的时候，调用模拟网络请求方法
    [self imitateNetWorkRequestLoadData];
    
}

#pragma mark -决定哪一行是可以进行编辑的
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}

#pragma mark - 决定表格的编辑模式
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return indexPath.row % 2 ? UITableViewCellEditingStyleDelete :UITableViewCellEditingStyleInsert;
}

#pragma mark - 根据传入的editingStyle的模式来决定是哪种编辑操作
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    // 1、对编辑的模式进行判断
    if(editingStyle == UITableViewCellEditingStyleDelete) {
        // 2、从数据源中将选中行的对应的数组中的下标模型移除
        [self.examArray removeObjectAtIndex:indexPath.row];
        // 3、刷新表格
        //        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];这个方法不可取，这是刷新表格中的每一行的，而我们是要将从数组中移除的对应的模型的数据在表格中将其删除
        
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }else{
        // 添加更多的模型数据
        XGExamFrame *examFrame = [[XGExamFrame alloc] init];
        
        // 随机取出模型中的一个
        // 数组中元素的总个数
        NSInteger count = self.examArray.count;
        // 从总个数中产生一个随机数
        NSInteger index = arc4random()%count;
        // 取出随机数对应的模型
        examFrame = self.examArray[index];
        // 将随机产生的模型数据添加在当前行对应的索引的后面
        [self.examArray insertObject:examFrame atIndex:indexPath.row + 1];
        
        // 刷新数据
        [self.tableView reloadData];
        // 让tableView自动滚动到刚插入数据的位置
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
}

#pragma mark - 决定删除按钮上显示的文字
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return @"干掉它";
}

#pragma mark - 被选中的行能否移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
    
}

#pragma mark - 重写此方法，支持重新排序，界面上的排序工作已经完成，但是数据源不会发生变化
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{
    NSInteger from = [fromIndexPath row];
    NSInteger to = [toIndexPath row];
    // 获取将要移动的数据
    id targetAr = [self.examArray objectAtIndex:from];
    // 从数组中删除指定的数据项
    [self.examArray removeObjectAtIndex:from];
    // 将要移动的数据插入到指定的位置
    [self.examArray insertObject:targetAr atIndex:to];
    
    //    [self setEditing:NO animated:NO];
    
}
#warning 复制、粘贴
/**
 #pragma mark - 要不要显示复制、粘贴菜单
 - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
 {
 return YES;
 // 第一行长按时不会显示复制、粘贴菜单
 if (indexPath.row == 0){// 如果是第一行就不显示
 return NO;
 
 }else{// 不是第一行就显示
 
 return YES;
 }
 }
 
 #pragma mark - 决定菜单上显示的名称
 - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender{
 // 菜单只有copy 和 paste 显示出来
 if(action == @selector(copy:) || action == @selector(paste:)){
 return YES;
 }else{
 
 return YES;
 }
 
 }
 
 #pragma mark - 当点击菜单中的选项时调用的方法
 - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender {
 if (action == @selector(copy:)){
 // copy的数据是被长按那一行的内容
 
 // 1、取出被点击的cell对应的模型
 XGExamFrame *frame = self.examArray[indexPath.row];
 
 // 2、把取出的内容复制到剪贴板中，剪贴板是属于全局的
 XGExamModel *model = frame.examM;
 
 
 //        NSLog(@"%@---%@---%@---%@", model.icon, model.name, model.content, model.picture);
 
 if (frame.examM.picture){
 [UIPasteboard generalPasteboard].strings = @[model.icon,model.name,model.content,model.picture];
 }else{
 [UIPasteboard generalPasteboard].strings = @[model.icon,model.name,model.content];
 }
 }else if (action == @selector(paste:)){
 // 1、取出剪贴板中保存的内容
 NSArray *copyArray = [UIPasteboard generalPasteboard].strings;
 
 // 重新实例化一个模型对形象
 XGExamModel *pasteModel = [[XGExamModel alloc] init];
 pasteModel.icon = copyArray[0];
 pasteModel.name = copyArray[1];
 pasteModel.content = copyArray[2];
 if (pasteModel.picture){
 pasteModel.picture = copyArray[3];
 }
 
 
 // 刷新数据源
 [self.examArray insertObject:pasteModel atIndex:indexPath.row];
 
 // 刷新表格
 [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
 
 }
 }
 */
#pragma mark - 当选中某一行时会调用这个方法(内容:修改cell中的内容后,自动就算控件的尺寸,对数据进行更新)
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    // 弹框的标题和样式
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"编辑" message:@"请在下面的文本框中修改你想要的数据" preferredStyle:UIAlertControllerStyleAlert];
    
    
    // 添加一个动作按钮（取消)
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    [alertController addAction:cancel];
    
    // 添加一个动作按钮
    UIAlertAction *sure = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        // 1、 取出选中行对应的模型的名字
        // 1.1 取出弹框中的textField
        UITextField *textF = [alertController textFields][0];
        UITextField *textS = [alertController textFields][1];
        // 1.2 取出textField中的内容
        NSString *newName = textF.text;
        NSString *newContent = textS.text;
        
        // 2、修改模型中的数据
        XGExamFrame *examFrame = self.examArray[indexPath.row];
        XGExamModel *examM = examFrame.examM;
        
        // 2.1 将textField中的文字赋值给模型中的属性
        examM.name = newName;
        examM.content = newContent;
        // 2.2 重新计算文字的尺寸
        examFrame.examM = [examFrame examM];
        // 3、刷新数据源
        
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        
        //        [UIView animateWithDuration:1.0 animations:^{
        //            [self.tableView setEditing:YES animated:YES];
        //
        //        }];
    }];
    // 将确定按钮添加到弹框中
    [alertController addAction:sure];
    
    // 取出选中行对应的模型
    XGExamFrame *exFrame = self.examArray[indexPath.row];
    XGExamModel *exModel = exFrame.examM;
    
    // 添加输入框
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        //  将选中行对应的标题赋值给输入框
        textField.text = exModel.name;
    }];
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.text = exModel.content;
    }];
    
    // 让弹框显示
    [self presentViewController:alertController animated:YES completion:nil];
    
}

#pragma mark - 利用代理实现头像的点击事件
-(void)examCellWithIconImageAddHandclick:(XGExamCell *)celled{
    if(self.tableView.isEditing){// 如果当前是编辑的状态就让它结束编辑
        
        [self.tableView setEditing:NO animated:NO];
        
    }else{// 如果当前不是编辑状态，让其进入编辑的状态
        
        [self.tableView setEditing:YES animated:YES];
        
    }
}

#pragma mark - 用通知的方法实现头像的点击
-(void)iconImageHandClick:(NSNotification *)not{
    [self.tableView setEditing:YES animated:YES];
}

#pragma mark - 利用通知实现配图的点击事件
-(void)examCellWithPictureChangeBig:(NSNotification *)not{
    
    // 取出要改变图片的名字
    self.btnBigName = not.userInfo[@"picture"];
    
    // 调用添加阴影和图片放大的方法
    [self addbigImageCover];
}

#pragma mark - 点击图片时让图片放大
-(void)addbigImageCover{
    // 创建要放大的图片
    UIImageView *bigImageView = [[UIImageView alloc] initWithFrame:CGRectMake(XGScreenW * 0.5, XGScreenH * 0.5, 0, 0)];
    UIImage *image = [UIImage imageNamed:self.btnBigName];
    bigImageView.image = image;
    bigImageView.userInteractionEnabled = NO;
    [self.tableView.window addSubview:bigImageView];
    self.bigView = bigImageView;
    
    // 创建一个遮盖
    UIButton *cover = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, XGScreenW, XGScreenH)];
    cover.backgroundColor = [UIColor blackColor];
    cover.alpha = 0.0;
    [cover addTarget:self action:@selector(bigImage) forControlEvents:UIControlEventTouchDown];
    [self.tableView.superview addSubview:cover];
    self.cover = cover;
    
    [self bigImage];
}

#pragma mark - 放大和缩小图片
- (void)bigImage
{
    // 1. 增加蒙版(跟根视图一样大小)
    if (self.cover.alpha == 0.0) {
        // 2. 将图片移动到视图的顶层
        [self.view.superview bringSubviewToFront:self.bigView];
        self.cover.alpha = 0.0;
        // 3. 动画放大图片
        CGFloat imageW = XGScreenW;
        CGFloat imageH = imageW;
        CGFloat imageY = (XGScreenH - XGScreenW) * 0.5;
        
        [UIView animateWithDuration:2.0 animations:^{
            self.cover.alpha = 0.7;
            self.bigView.alpha = 1.0;
            self.bigView.frame = CGRectMake(0, imageY, imageW, imageH);
        }];
    } else {
        // 图片已经是放大显示的了
        [UIView animateWithDuration:2.0 animations:^{
            // 1. imageVew动画变小
            self.bigView.frame = CGRectMake(XGScreenW * 0.5, XGScreenH * 0.5, 0, 0);
            self.bigView.alpha = 0.0;
            // 2. 遮罩透明，看不见了
            self.cover.alpha = 0.0f;
            
        } completion:^(BOOL finished) {
            [self.bigView removeFromSuperview];
            [self.cover removeFromSuperview];
        }];
    }
}

#pragma mark - 移除通知
-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

#pragma mark - 随机产生一个数据方法
-(void)loadArcData{
    // 添加更多的模型数据
    XGExamFrame *examFrame = [[XGExamFrame alloc] init];
    
    // 随机取出模型中的一个
    // 数组中元素的总个数
    NSInteger count = self.examArray.count;
    // 从总个数中产生一个随机数
    NSInteger index = arc4random()%count;
    // 取出随机数对应的模型
    examFrame = self.examArray[index];
    // 将随机的模型添加到数组中
    [self.examArray addObject:examFrame];
    
    [UIView animateWithDuration:0.2 delay:1.0 options:UIViewAnimationOptionCurveLinear animations:^{
        // 刷新数据
        [self.tableView reloadData];
        
    } completion:^(BOOL finished) {
        // 自动滚动到最后一行
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.examArray.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
        
    }];
}

#pragma mark - 手动创建模拟网路请求
-(void)imitateNetWorkRequestLoadData{
    // 添加义个view
    UIView *mainView = [[UIView alloc] init];
    mainView.backgroundColor = [UIColor whiteColor];
    CGFloat mainViewW = 160;
    CGFloat mainViewH = mainViewW;
    CGFloat mainViewX = ([UIScreen mainScreen].bounds.size.width - mainViewW) * 0.5;
    CGFloat mainViewY = ([UIScreen mainScreen].bounds.size.height - mainViewH) * 0.5;
    mainView.frame = CGRectMake(mainViewX, mainViewY, mainViewW, mainViewH);
    mainView.center = self.view.center;
    mainView.alpha = 0.5;
    mainView.layer.cornerRadius = 25;
    mainView.clipsToBounds = YES;
    [self.tableView.superview addSubview:mainView];
    
    // 用来添加对号的view
    UIImageView *right = [[UIImageView alloc] init];
    right.image = [UIImage imageNamed:@"activity"];
    right.hidden = YES;
    [mainView addSubview:right];
    CGFloat rightW = 80;
    CGFloat rightH = 80;
    CGFloat rightX = (mainViewW - rightW) * 0.5;
    CGFloat rightY = 20;
    right.frame = CGRectMake(rightX, rightY, rightW, rightH);
    [mainView addSubview:right];
    
    // 底部的文字
    UILabel *intro = [[UILabel alloc] init];
    
    intro.font = [UIFont boldSystemFontOfSize:17];
    intro.textAlignment = NSTextAlignmentCenter;
    intro.textColor = [UIColor blackColor];
    intro.text = [NSString stringWithFormat:@"正在更新数据..."];
    CGFloat introX = 0;
    CGFloat introW = mainViewW;
    CGFloat introH = 50;
    CGFloat introY = CGRectGetMaxY(right.frame);
    intro.frame = CGRectMake(introX, introY, introW, introH);
    [mainView addSubview:intro];
    
    // 菊花
    UIActivityIndicatorView *rotation = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    rotation.center = CGPointMake(mainViewW * 0.5, mainViewH * 0.5 - 20);
    [rotation startAnimating];
    //    rotation.hidden = NO;
    rotation.color = [UIColor greenColor];
    //    rotation.hidesWhenStopped = YES;
    [mainView addSubview:rotation];
    
    // 2.动画
    [UIView animateWithDuration:3.0 animations:^{
        self.tableView.alpha = 0.1;
        [self.tableView.superview bringSubviewToFront:mainView];
        mainView.alpha = 1.0;
        // 禁止用户进行点击操作
        self.tableView.userInteractionEnabled = NO;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveLinear animations:^{
            [self loadArcData];
            [self.tableView reloadData];
            intro.text = [NSString stringWithFormat:@"数据已更新完毕."];
            [rotation stopAnimating];
            right.hidden = NO;
            mainView.alpha = 0.0;
        } completion:^(BOOL finished) {
            self.tableView.alpha = 1.0;
            [mainView removeFromSuperview];
            self.tableView.userInteractionEnabled = YES;
        }];
    }];
}
@end
